/**
 *   Classe que salva no banco de dados, em formato txt.
 * @author Amaury Medeiros
 * @author Danilo Freitas
 * @author Felipe Vieira
 * @author Nicholas Alexander
 * @author Paulo Victor
 *
 */
package sistema;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import conta.ContaUserStories;
import excecoes.PessoaException;
import excecoes.UsuarioException;

public class manipuladorTXT implements Manipulavel {

	private static manipuladorTXT instanciaUnica = null;
	private final String SEPARADOR_CONTAS = "!@!";
	private final String SEPARADOR_ATRIBUTOS = "|";
	
	/**
	 * Construtor da classe
	 */
	protected manipuladorTXT() {
	}
	
	/**
	 * Garante que apenas um construtor da classe seja criado.
	 * @return instanciaUnica
	 */
	public synchronized static manipuladorTXT getInstance() {
		if (instanciaUnica == null) {
			instanciaUnica = new manipuladorTXT();
		}
		return instanciaUnica;
	}

	/**
	 * retorna um Array List de contas.
	 */
	public ArrayList<ContaUserStories> carregarContas(String arquivo)
			throws UsuarioException, PessoaException, FileNotFoundException,
			IOException {
		String[] contasTXT = carregar(arquivo).split(SEPARADOR_CONTAS);
		ArrayList<ContaUserStories> contas = new ArrayList<ContaUserStories>();
		for (String conta : contasTXT) {
			ContaUserStories contaAtual = geraConta(conta);
			contas.add(contaAtual);
		}
		return contas;
	}

	/**
	 * Salva o Array List de contas no arquivo contas.txt
	 */
	public void salvar(ArrayList<ContaUserStories> asContas) throws IOException {
		FileWriter arquivo = new FileWriter(new File("contas.txt"));
		String aEscrever = "";
		for (ContaUserStories conta : asContas) {
			String dadosFormatados = formataDados(conta);
			aEscrever += dadosFormatados + SEPARADOR_CONTAS;
		}
		arquivo.write(aEscrever);
		arquivo.close();
	}

	/**
	 * Formata os dados de uma conta utilizando pipe("|")
	 * @param conta
	 * @return dadosFormatados
	 */
	private String formataDados(ContaUserStories conta) {
		String dadosFormatados;
		String userName = conta.getUsuario().getUserName();
		String nome = conta.getPessoa().getNome();
		String email = conta.getPessoa().getEmail();
		String senha = conta.getUsuario().getSenha();
		String telefone = conta.getPessoa().getTelefone();
		String latitude = conta.getLocalizacao().getLatitude();
		String longitude = conta.getLocalizacao().getLongitude();

		dadosFormatados = userName + SEPARADOR_ATRIBUTOS + nome
				+ SEPARADOR_ATRIBUTOS + email + SEPARADOR_ATRIBUTOS + senha
				+ SEPARADOR_ATRIBUTOS + telefone + SEPARADOR_ATRIBUTOS
				+ latitude + SEPARADOR_ATRIBUTOS + longitude;

		return dadosFormatados;
	}
	
	/**
	 * gera uma conta através de dados Formatados
	 * @param dados
	 * @return conta
	 * @throws UsuarioException
	 * @throws PessoaException
	 */
	public ContaUserStories geraConta(String dados) throws UsuarioException,
			PessoaException {
		String[] atributos = dados.split(SEPARADOR_ATRIBUTOS);
		String userName = atributos[0];
		String nome = atributos[1];
		String email = atributos[2];
		String senha = atributos[3];
		String telefone = atributos[4];
		String latitude = atributos[5];
		String longitude = atributos[6];
		ContaUserStories conta = new ContaUserStories(userName, nome, email,
				senha, telefone, latitude, longitude);

		return conta;
	}

	/**
	 * Carrega o conteúdo de um arquivo numa string.
	 */
	public String carregar(String arquivo) throws FileNotFoundException,
			IOException {
		File file = new File(arquivo);

		if (!file.exists()) {
			return "Ainda nao existem contas no sistema!!!";
		}

		BufferedReader br = new BufferedReader(new FileReader(arquivo));
		StringBuffer bufSaida = new StringBuffer();

		String linha;
		while ((linha = br.readLine()) != null) {
			bufSaida.append(linha + "\n");
		}

		br.close();
		return bufSaida.toString().trim();
	}
	
}
